package displayboardinfo.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

/**
 *  
 * Klasa reprezentująca klienta zapisanego na otrzymywanie aktualizacji konkretnego gabinetu.
 *
 * @author Artur Jaworski
 */
@Entity
@Table ( name = "RegisteredForUpdates" )
@XmlRootElement
@XmlType(propOrder = { "id", "room", "ip", "port" })
public class RegisteredForUpdates {
	@Id
	@Column ( name = "id" )
	@GeneratedValue(strategy=GenerationType.AUTO)
	protected long id;
	
	@ManyToOne
	@JoinColumn ( name = "id_room", nullable = false )
	protected Room room;
		
	@Column ( name = "ip", nullable = false )
	protected String ip;
	
	@Column ( name = "port", nullable = false )
	protected Integer port;
	
	/**
	 * Domyślny konstruktor bezargumentowy.
	 */
	public RegisteredForUpdates() {
	
	}
	
	/**
	 * Pobranie unikalnego numeru ID powiązania. 
	 * 
	 * @return unikalny numer ID
	 */
	public long getId() {
		return id;
	}

	/**
	 * Ustawienie unikalnego numeru ID powiązania.
	 * Ręczne ustawianie numeru ID powinno być zawsze robione z rozwagą. 
	 * 
	 * @param id unikalny numer ID
	 */
	public void setId(long id) {
		this.id = id;
	}

	/**
	 * Pobranie obiektu gabinetu, na aktualizacje którego zapisał się klient.
	 * 
	 * @return gabinet, na aktualizacje którego zapisał się klient 
	 */
	public Room getRoom() {
		return room;
	}

	/**
	 * Ustawienie obiektu gabinetu, na aktualizacje którego zapisał się klient.
	 * 
	 * @param room gabinet, na aktualizacje którego zapisał się klient 
	 */
	public void setRoom(Room room) {
		this.room = room;
	}

	/**
	 * Pobranie adresu IP, na którym klient wystawia usługę aktualizacji.
	 * 
	 * @return adres IP, na którym klient wystawia usługę aktualizacji
	 */
	public String getIp() {
		return ip;
	}

	/**
	 * Ustawienie adresu IP, na którym klient wystawia usługę aktualizacji.
	 * 
	 * @param displayIp adres IP, na którym klient wystawia usługę aktualizacji
	 */
	public void setIp(String displayIp) {
		this.ip = displayIp;
	}

	/**
	 * Pobranie numeru portu, na którym klient wystawia usługę aktualizacji.
	 * 
	 * @return numer portu, na którym klient wystawia usługę aktualizacji
	 */
	public Integer getPort() {
		return port;
	}

	/**
	 * Ustawienie numeru portu, na którym klient wystawia usługę aktualizacji.
	 * 
	 * @param port numer portu, na którym klient wystawia usługę aktualizacji
	 */
	public void setPort(Integer port) {
		this.port = port;
	}
	
	/**
	 * Konwersja obiektu zapisania na aktualizacje gabinetu na łatwy do zrozumienia łańcuch znaków.
	 * 
	 * @return sformatowany łańcuch znaków
	 */
	@Override
	public String toString() {
		String text = new String();
		
		text += "\nid:" + id + "\n" +
				"ip:" + ip + "\n" +
				"port:" + port;
		if (room != null)
			text += "\nidRoom:" + room.getId();
		
		return text;
	}
	
	/**
	 * Wywołanie usługi aktualizacji klienta.
	 * 
	 * @return czy wywołanie aktualizacji zakończyło się powodzeniem
	 */
	public boolean update(){
		try{
			System.out.println("StartUpdate: " + ip + ":" + port);
			ClientConfig config = new DefaultClientConfig();
			Client client = Client.create(config);
			WebResource service = client.resource(UriBuilder.fromUri("http://"+this.ip+":"+this.port+"/update").build());
			ClientResponse res = service.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
			if (res.getStatus() == ClientResponse.Status.OK.getStatusCode())
				return true;
			else
				return false;
		} catch (Exception e) {
			return false;
		} finally {
			System.out.println("FinishUpdate: " + ip + ":" + port);
		}
	}
	
}
